/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package web;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.birrap.ejb.BaresCervezasTapasVasosTBeanLocal;
import org.birrap.ejb.BaresTBeanLocal;
import org.birrap.ejb.BaresUsuarioTBeanLocal;
import org.birrap.ejb.UsuariosTBeanLocal;
import org.birrap.entities.BaresCervezasTapasVasosT;
import org.birrap.entities.BaresT;
import org.birrap.entities.BaresUsuarioT;
import org.birrap.entities.BaresUsuarioTPK;
import org.birrap.entities.UsuariosT;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import util.FacesMessagesUtil;

/**
 *
 * @author Denver
 */
@ManagedBean
@RequestScoped
public class PerfilManagedBean {

    /**
     * Creates a new instance of PerfilManagedBean
     */
    @EJB
    private UsuariosTBeanLocal usuarioBean;
    
    @EJB
    private BaresTBeanLocal baresBean;
    
    @EJB 
    private BaresUsuarioTBeanLocal baresUsuarioBean;
    
    @EJB
    private BaresCervezasTapasVasosTBeanLocal baresCervezasVasosBean;
   
    private FacesContext  context;
    private UsuariosT usuario;
    private String repassword;
    private String password;
    private String passwordActual;
    private boolean esDueno;
    private boolean tieneLocales;
    private BaresT local;
    private BaresT barTUlitmo;
    private BaresUsuarioT barUserT;
    private String nombre;
    private UploadedFile file;  
    private BaresUsuarioT selectedBar;
    private List<BaresUsuarioT> bares;
    private List<BaresCervezasTapasVasosT> listaCervezas;
    private boolean renderFormulario;



    
    
    public PerfilManagedBean() {
        context = FacesContext.getCurrentInstance();
        usuario = (UsuariosT)context.getExternalContext().getSessionMap().get("usuario");
        password = "Introduzca Password";
        repassword= "Reescriba Password";
        passwordActual = "actual";
   //////////*********************COMPROBAR QUE USUARIO A PARTE DE TENER BARES SEA DUEÑO***********7///////////////////////////
        tieneLocales = usuario.getBaresUsuarioTCollection().isEmpty();
        local = new BaresT();
        barTUlitmo = new BaresT();
        barUserT = new BaresUsuarioT();
        bares = new ArrayList<BaresUsuarioT>();
        esDueno = false;
        renderFormulario = true;
        listaCervezas = new ArrayList<BaresCervezasTapasVasosT>();
             
    }
    
 
    
    
    public void updateDatos() {        
        String res = "ERROR";
        
        if(validateDatos()) 
        {
            UsuariosT user = usuarioBean.update(usuario);

            if(user == null) 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "Error", 
                                                          "El usuario no ha podido ser actualizado."));
                res = "ERROR";
            }
            else 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "OK", 
                                                          "El usuario ha sido actualizado."));
                res = "OK";
            }
        }
        
    }
    
    /**
     * Metodo con el que comprobamos que todos los campos a la hora de hacer SignIn sean correctos
     * @return boolean
     */
    private boolean validateDatos() {
        
        boolean validado = false;
        
        if(usuario.getNombre() == null || usuario.getNombre().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere un nombre.", 
                                                      "Se requiere un nombre."));
        }
        if(usuario.getApellidos() == null || usuario.getApellidos().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere un apellido.", 
                                                      "Se requiere un apellido."));
        }
        if(usuario.getCorreo() == null  || usuario.getCorreo().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere el correo.", 
                                                      "Se requiere el correo."));
        }
        if(!FacesMessagesUtil.hasMessages(context))
        {
            validado = true;
        }
        return validado;
    }
    
        public void updatePass() {        
        String res = "ERROR";
        
        if(validatePass()) 
        {
            UsuariosT user = usuarioBean.update(usuario);

            if(user == null) 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "Error", 
                                                          "El usuario no ha podido ser actualizado."));
                res = "ERROR";
            }
            else 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "OK", 
                                                          "El usuario ha sido actualizado."));
                res = "OK";
            }
        }
        
    }
    
    private boolean validatePass() {
        
        boolean validado = false;
        
        if(usuario.getPassword() == null || usuario.getPassword().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere una contraseña.", 
                                                      "Se requiere una contraseña."));
        }
        if(repassword == null || repassword.isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere reescribir la contraseña.", 
                                                      "Se requiere reescribir la contraseña."));
        }
        
        if(!passwordActual.equals("actual")){
            if(usuario.getPassword() == null || passwordActual == null ||
               !usuario.getPassword().equals(passwordActual)) 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                          "El password actual no coincide. ", 
                                                          "El password actual no coincide."));
            }
        }
        if(!password.equals("Introduzca Password") && !repassword.equals("Reescriba Password")){
            if(password == null || password.isEmpty() || 
               !repassword.equals(password)) 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                          "El nuevo password no coincide.", 
                                                          "El nuevo password no coincide."));
            }
            else{
                usuario.setPassword(password);
            }
        }
        if(!FacesMessagesUtil.hasMessages(context))
        {
            validado = true;
        }
        return validado;
    }
    
     public void updateCuentaTwitter() {        
        String res = "ERROR";
        
        if(validateCuentaTwitter()) 
        {
            UsuariosT user = usuarioBean.update(usuario);

            if(user == null) 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "Error", 
                                                          "El usuario no ha podido ser actualizado."));
                res = "ERROR";
            }
            else 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "OK", 
                                                          "El usuario ha sido actualizado."));
                res = "OK";
            }
        }
        
    }
     
        private boolean validateCuentaTwitter() {
            
        boolean validado = false;
        

        if(usuario.getTwitter()== null  || usuario.getTwitter().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere una cuenta de Twitter.", 
                                                      "Se requiere una cuenta de Twitter."));
        }
        if(usuario.getTwitterPass()== null || usuario.getTwitterPass().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere un password de Twitter", 
                                                      "Se requiere un password de Twitter."));
        }
        
        if(!FacesMessagesUtil.hasMessages(context))
        {
            validado = true;
        }
        return validado;
    }
        
    public void updateCuentaFacebook() {        
        String res = "ERROR";
        
        if(validateCuentaFacebook()) 
        {
            UsuariosT user = usuarioBean.update(usuario);

            if(user == null) 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "Error", 
                                                          "El usuario no ha podido ser actualizado."));
                res = "ERROR";
            }
            else 
            {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                          "OK", 
                                                          "El usuario ha sido actualizado."));
                res = "OK";
            }
        }
     }
        
     public boolean validateCuentaFacebook(){
         
         boolean validado = false;
         
        if(usuario.getFacebook() == null || usuario.getFacebook().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere una cuenta de FaceBook.", 
                                                      "Se requiere una cuenta de FaceBook."));
        }
        if(usuario.getFacebookPass() == null || usuario.getFacebookPass().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere un password de Facebook.", 
                                                      "Se requiere un password de Facebook"));
        }
        if(!FacesMessagesUtil.hasMessages(context))
        {
            validado = true;
        }
        return validado;
     }
     
     public void creaLocal() {        
        String res = "ERROR";
//        local.setIdBar(27);
        
        if(validateLocal()) 
        {
//            BaresT user = baresBean.insert(local);
            BaresT bar = baresBean.update(local);
            
            if(bar == null) 
            {
//                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
//                                                          "El bar no ha podido ser creado.", 
//                                                          "El bar no ha podido ser creado."));
                res = "ERROR";
            }
            else 
            {
//                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
//                                                          "El bar ha sido añadido.", 
//                                                          "El bar ha sido añadido."));
                res = "OK";
                BaresUsuarioT baresUsuario = new BaresUsuarioT();
                BaresUsuarioTPK baresUsuarioTPK = new BaresUsuarioTPK(bar.getIdBar(), usuario.getCorreo());

                baresUsuario.setBaresUsuarioTPK(baresUsuarioTPK);
                baresUsuario.setUsuariosT(usuario);
                baresUsuario.setBaresT(bar);
                baresUsuario.setDueno("Y");

                BaresUsuarioT baresUsuarioT = baresUsuarioBean.update(baresUsuario);

                if(baresUsuarioT == null) 
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                              "El bar no ha podido ser creado.", 
                                                              "El bar no ha podido ser creado."));
                    res = "ERROR";
                }
                else 
                {
                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 
                                                              "El bar ha sido añadido.", 
                                                              "El bar ha sido añadido."));
                    res = "OK";
                }
            }   
            
        }
        
    }
     
     private boolean validateLocal() {
        
        boolean validado = false;
        
        if(local.getNombre() == null || local.getNombre().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere un nombre.", 
                                                      "Se requiere un nombre."));
        }
        if(local.getDireccion()== null || local.getDireccion().isEmpty()) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere una direccion.", 
                                                      "Se requiere una direccion."));
        }
        if(local.getCodigoPostal()== null) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere el código postal.", 
                                                      "Se requiere el código postal."));
        }
         if(local.getTelefono()== null) 
        {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 
                                                      "Se requiere un telefono.", 
                                                      "Se requiere una telefono."));
        }
        if(!FacesMessagesUtil.hasMessages(context))
        {
            validado = true;
        }
        return validado;
    }
     
     public void eliminarLocal ()
    {
          
        
        BaresUsuarioTPK baresUsuarioTPK = new BaresUsuarioTPK();
        baresUsuarioTPK.setCorreo(usuario.getCorreo());
        baresUsuarioTPK.setIdBar(selectedBar.getBaresT().getIdBar());
        
        if (baresUsuarioBean.remove(baresUsuarioTPK))
        {
           context
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                                                           selectedBar.getBaresT().getNombre() +
                                                           " se ha eliminado de su lista de locales", 
                                                           selectedBar.getBaresT().getNombre() +
                                                           " se ha eliminado de su lista de locales"));
        }
        else
        {
            context
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                           "No se a podido eliminar de su lista de locales " +
                                                           selectedBar.getBaresT().getNombre() +
                                                           " debido a un error interno.", 
                                                           "No se a podido eliminar de su lista de locales " +
                                                           selectedBar.getBaresT().getNombre() +
                                                           " debido a un error interno."));
        }
        
        if (baresBean.remove(selectedBar.getBaresT().getIdBar()))
        {
           context
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                                                           selectedBar.getBaresT().getNombre() +
                                                           " se ha eliminado de la lista locales", 
                                                           selectedBar.getBaresT().getNombre() +
                                                           " se ha eliminado de la lista de locales"));
        }
        else
        {
            context
                        .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                           "No se a podido eliminar de la lista de locales " +
                                                           selectedBar.getBaresT().getNombre() +
                                                           " debido a un error interno.", 
                                                           "No se a podido eliminar de la lista de locales " +
                                                           selectedBar.getBaresT().getNombre() +
                                                           " debido a un error interno."));
        }
        
      
        getBares();
    }
    
      
    public void upload() {  
        FacesMessage msg = new FacesMessage("Ok", "Fichero " + file.getFileName() + " subido correctamente.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }  
     


   
    
    public String irAEditar ()
    {
        FacesContext facesContext = FacesContext.getCurrentInstance(); 
        
        PerfilEditarManagedBean detalleManagedBean = FacesContext.getCurrentInstance()
                                                            .getApplication()
                                                            .evaluateExpressionGet(facesContext, 
                                                                                   "#{perfilEditarManagedBean}", 
                                                                                   PerfilEditarManagedBean.class); 
        selectedBar = baresUsuarioBean.findByIdBarSiesDueno(selectedBar.getBaresT().getIdBar());
        detalleManagedBean.setBarUsuarioT(selectedBar);
        
        return "EDITAR";
    }
    
        public List<BaresCervezasTapasVasosT> getListaCervezas(BaresUsuarioT bar)
    {
     
        if(bar!=null){
            

            listaCervezas = new ArrayList<BaresCervezasTapasVasosT>();
            List<BaresCervezasTapasVasosT> coleccionBares = new ArrayList<BaresCervezasTapasVasosT>();

            if(baresCervezasVasosBean.findBaresByIdBar(bar.getBaresT().getIdBar())!=null){
                coleccionBares = new ArrayList(baresCervezasVasosBean.findBaresByIdBar(bar.getBaresT().getIdBar()));
            }

            for(int i=0; i!=coleccionBares.size(); i++)
            {

                    if(coleccionBares.get(i)!=null  && listaCervezas!=null){
                        listaCervezas.add(coleccionBares.get(i));

                }
            }
        }
        return listaCervezas;
    }
    
    
      public List<BaresUsuarioT> getBares() {
         List<BaresUsuarioT> baresPedidos = baresUsuarioBean.findByCorreoYDueno(usuario.getCorreo());
        
        if(baresPedidos == null){
            baresPedidos = new ArrayList<BaresUsuarioT>();
        }
        else
        {
        bares = baresPedidos;
        }
            return bares;
    }
      
     public void setBares(List<BaresUsuarioT> bares) {
        this.bares = bares;
         
    }
    
    public UsuariosT getUsuario() {
        
        return usuario;
    }

    public void setUsuario(UsuariosT usuario) {
        this.usuario = usuario;
    }

    public String getPassword() {
 
            return password;

    }

    public void setPassword(String password) {
        this.password = password;
    }
    
    
    public String getRepassword() {

            return repassword;
   
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }

    public String getPasswordActual() {
 
            return passwordActual;

    }

    public void setPasswordActual(String passwordActual) {
        
        this.passwordActual = passwordActual;
    }

    public boolean isEsDueno() {
        
        if(usuario.getIdRol().getIdRol().equals("usuario-local")){
            this.esDueno = true;
        }
        return esDueno;
    }

    public boolean isRenderFormulario() {
        if(baresUsuarioBean.findByCorreoYDueno(usuario.getCorreo()).isEmpty()){
            this.renderFormulario = false;
        }
        return renderFormulario;
    }

    public void setRenderFormulario(boolean renderFormulario) {
        this.renderFormulario = renderFormulario;
    }

    

    public boolean isTieneLocales() {
        return tieneLocales;
    }

    public void setTieneLocales(boolean tieneLocales) {
        this.tieneLocales = tieneLocales;
    }

    public BaresT getLocal() {
        return local;
    }

    public void setLocal(BaresT local) {
        this.local = local;
    }
    
     
    public UploadedFile getFile() {  
        return file;  
    }  
   
    public void setFile(UploadedFile file) {  
        this.file = file;  
    }  

    public BaresUsuarioT getSelectedBar() {
        return selectedBar;
    }

    public void setSelectedBar(BaresUsuarioT selectedBar) {
        this.selectedBar = selectedBar;
    }

    
    
}
